﻿using System;
using Irony;
using Irony.Parsing;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AppServidor
{
    class AnalizadorLista
    {
        public String cad = "";
        public StringBuilder thtml;
        public List<Lista> bibliotecaListas;
        public List<string> cads;
        public int[] numsord;
        public string[] cadsord;
        public StringBuilder graph;
        int nivel = 0;

        public bool isValid(string codigo, Grammar grammar)
        {
            LanguageData lenguaje = new LanguageData(grammar);
            Parser p = new Parser(lenguaje);
            ParseTree arbol = p.Parse(codigo);

            if (bibliotecaListas == null)
            {
                bibliotecaListas = new List<Lista>();
            }
            else { bibliotecaListas.Clear(); }
            //cads = new List<string>();
           evaluar(arbol.Root);

            return arbol.Root != null;
        }


        void print(object a)
        {

            System.Console.Write(a);
           
        }
        void println(object a)
        {

            System.Console.WriteLine(a);

        }

        private Lista LA(ParseTreeNode nodo)
        {
            Lista lista = new Lista();

            LA2(nodo, lista);
            if(lista.Nombre!=null)
            bibliotecaListas.Add(lista);
            return lista;
        }


        private void LP(ParseTreeNode nodo, List<String> lector)
        {
            String cadena = nodo.ToString();
            if (cadena.CompareTo("LP") == 0)
            {
                if (nodo.ChildNodes.Count > 1)
                {
                    LP(nodo.ChildNodes[0], lector);
                    lector.Add(nodo.ChildNodes[2].FindTokenAndGetText());

                }
                else
                {
                    LP(nodo.ChildNodes[0], lector);
                }
            }
            else
            {
              
                    cadena = nodo.FindTokenAndGetText();
                     lector.Add(cadena);
                
            }
        }

        private void LA2(ParseTreeNode nodo,Lista lector)
        {
           
            String cadena = nodo.ToString();
            if (cadena.CompareTo("LA") == 0)
            {
                if (nodo.ChildNodes.Count > 1)
                {
                    LA2(nodo.ChildNodes[0], lector);
                    LA2(nodo.ChildNodes[2], lector);

                }
                else {
                    LA2(nodo.ChildNodes[0], lector);
                }
            }
            else
            {
                ParseTreeNode hijo2;
                if (cadena.CompareTo("A") == 0)
                {
                    hijo2 = nodo.ChildNodes[0];
                    cadena = hijo2.FindTokenAndGetText();
                    if (cadena.CompareTo("random") == 0)
                    {
                        hijo2 = nodo.ChildNodes[2];

                        lector.setRandom(hijo2.FindTokenAndGetText());
                        return;
                    }
                    if (cadena.CompareTo("circular") == 0)
                    {
                        hijo2 = nodo.ChildNodes[2];

                        lector.setRandom(hijo2.FindTokenAndGetText());
                        return;
                    }
                    if (cadena.CompareTo("nombre") == 0)
                    {
                        hijo2 = nodo.ChildNodes[2];

                        lector.Nombre = hijo2.FindTokenAndGetText();
                        lector.Nombre = lector.Nombre.Substring(1, lector.Nombre.Length - 2);
                        return;
                    }
                    if (cadena.CompareTo("pistas") == 0)
                    {
                        hijo2 = nodo.ChildNodes[3];
                        LP(hijo2,lector.Pistas);
                      
                        return;
                    }
                   
                }
            }
             

        }
        public String evaluar(ParseTreeNode nodo)
        {
         
            if (nodo != null )
            {
               
                String cadena= nodo.ToString();
                if (cadena.CompareTo("L") == 0) { 
                    ParseTreeNodeList lista= nodo.ChildNodes;
                    ParseTreeNode hijo = lista[0];
                    cadena = hijo.Term.ToString();
                        if (cadena.CompareTo("{") == 0)
                        {
                            hijo = lista[1];
                            cadena = hijo.FindTokenAndGetText();
                            if (cadena.CompareTo("lista") == 0)
                            {
                                hijo = lista[4];
                                cadena = hijo.Term.ToString();
                                if(cadena.CompareTo("LA")==0)
                                LA(hijo);

                              

                            }
                        }
                    
                    if(cadena.CompareTo("L") == 0){
                       

                        evaluar(hijo);
                      
                      
                       
                        if (lista.Count > 1) {
                            hijo = lista[1];
                            cadena = hijo.FindTokenAndGetText();
                            if (cadena.CompareTo("{") == 0)
                            {
                                hijo = lista[2];
                                cadena = hijo.FindTokenAndGetText();
                                if (cadena.CompareTo("lista") == 0)
                                {
                                    hijo = lista[5];
                                    LA(hijo);
                                }
                            }
                            hijo = lista[2];
                            cadena = hijo.Term.ToString();
                            if (cadena.CompareTo("grupo_listas") == 0) {

                                evaluar(lista[5]);
                            }
                        }
                    }
                  
                }
                if (cadena.CompareTo("LGL") == 0)
                {
                     ParseTreeNodeList lista= nodo.ChildNodes;
                    ParseTreeNode hijo = lista[0];
                    cadena= hijo.Term.ToString();
                    if (cadena.CompareTo("LGL") == 0) {
                    
                            evaluar(hijo);
                        
                        hijo = lista[2];
                        cadena = hijo.Term.ToString();
                        if (cadena.CompareTo("LR") == 0)
                        {
                            hijo = hijo.ChildNodes[4];
                            cadena = hijo.Term.ToString();
                            if (cadena.CompareTo("LA") == 0)
                            {
                                this.LA(hijo);
                            }
                        }
                    }
                    if (cadena.CompareTo("LR") == 0)
                    {
                        hijo = hijo.ChildNodes[4];
                        cadena = hijo.Term.ToString();
                        if (cadena.CompareTo("LA") == 0)
                        {
                            this.LA(hijo);
                        }
                    }


                }


     
             

            }
            return "";
        }

    }
}
